// 请求基地址
let baseURL = "http://47.120.12.122:8001/api";
const token = "JWT eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ0b2tlbl90eXBlIjoiYWNjZXNzIiwiZXhwIjo0ODg0NDExOTgzLCJpYXQiOjE3MzA4MTE5ODMsImp0aSI6IjQ3MjliYWQ2MzNlYTRiYjVhODFhZWY5MWQ3ZGJmYmU3IiwidXNlcl9pZCI6MSwidXNlcm5hbWUiOiJhZG1pbiIsImlzX3Rlc3QiOnRydWV9._-theAO7px2yqvRXny7rtiYXdNblsIoD6Rmg8Tb1uus"
/** 节流函数 */
function throttleHandle(fn, delay) {
  let lastTime = 0;

  return function (...args) {
    const now = Date.now();
    if (now - lastTime >= delay) {
      fn.apply(this, args);
      lastTime = now;
    }
  };
}

// 拦截器配置
const httpInterceptor = {
  // 拦截前触发
  invoke(options) {
    // 1. 非 http 开头需拼接地址
    if (!options.url.startsWith("http")) {
      options.url = baseURL + options.url;
    }
    // 2. 请求超时
    options.timeout = 300000;
    // 3. 添加小程序端请求头标识
    options.header = Object.assign({
      "source-client": "miniapp",
    }, options.header);
    // 4. 添加 token 请求头标识
    // const token = uni.getStorageSync("token");
    if (token) {
      options.header.Authorization = token;
    }
    if (process.env.UNI_PLATFORM === "mp-weixin") {
      options.header["Cache-Control"] = "no-cache";
    }
  },
};

// 拦截 request 请求
uni.addInterceptor("request", httpInterceptor);
// 拦截 uploadFile 文件上传
uni.addInterceptor("uploadFile", httpInterceptor);

/**
 * 请求函数
 * @param  options
 * @returns Promise
 */
export function http(options) {
  // 1. 返回 Promise 对象
  return new Promise((resolve, reject) => {
    uni.request(Object.assign({}, options, {
      // 响应成功
      success(res) {
        // 取消时节流
        const throttledExecute = throttleHandle(() => {}, 300);
        throttledExecute();

        // 状态码 2xx，参考 axios 的设计
        if (res.statusCode >= 200 && res.statusCode < 300) {
          // 2.1 提取核心数据 res.data
          resolve(res.data);
        } else if (res.statusCode === 401) {
          // 401错误  -> 清理用户信息，跳转到登录页
          // #ifdef MP-WEIXIN
          // uni.reLaunch({ url: "/pages/login/index" });
          // uni.reLaunch({ url: '/pages/login/phoneLogin' })
          // #endif
          // #ifdef H5
          // uni.reLaunch({ url: "/pages/login/phoneLogin" });
          // #endif
          reject(res);
        } else {
          // 其他错误 -> 根据后端错误信息轻提示
          uni.showToast({
            icon: "none",
            title: res.data.msg || "请求错误",
          });
          reject(res);
        }
      },
      // 响应失败
      fail(err) {
        uni.showToast({
          icon: "none",
          title: "网络错误，换个网络试试",
        });

        // 取消时节流
        const throttledExecute = throttleHandle(() => {}, 300);
        throttledExecute();
        reject(err);
      },
    }));
  });
};